package Thread;
/*
 * 问题出现的原因：
 * 			要有多个线程
 * 			要有多个线程所共享的数据
 * 			多个线程并发的访问共享的数据
 * synchronized:同步，可以修饰代码块和方法，被修饰的代码块和方法一旦被某个
 * 				线程访问，其他的线程将无法访问
 * 同步代码块：
 * 			synchronize(锁对象){}
 * 
 * 注意：锁对象需要被所有的线程所共享
 * 
 * 同步：安全性高，效率低 
 * 非同步：效率高，但是安全性低
 * 
 * 同步方法：使用关键字synchronize修饰的方法，一旦被一个线程访问，则整个方法全被被锁住，其他线程则无法访问
 * 		synchronize
 * 
 * 注意：
 * 		非静态同步方法的锁对象是this
 * 		静态的同步方法的锁对象是当前类的字节码对象
 */
public class TicketThread implements Runnable{
	//火车票数量
	int tickets = 100;
	Object obj = new Object();
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(true) {
			synchronized (obj) {
				//当火车票小于0，则停止售票
				if(tickets>0) {
					try {
						Thread.sleep(tickets);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName()+":"+tickets--);
				}
			}
			
		}
	}
}
